﻿using ExcellentProjectPlus.Dominio.Calificaciones.Repositorios;
using ExcellentProjectPlus.Dominio.Calificaciones.Repositorios.Calificaciones;
using ExcellentProjectPlus.Dominio.Calificaciones.Repositorios.CursoEstudiantes;
using ExcellentProjectPlus.Dominio.Calificaciones.Repositorios.Cursos;
using ExcellentProjectPlus.Dominio.Calificaciones.Repositorios.Periodos;
using ExcellentProjectPlus.Dominio.Calificaciones.Repositorios.PromedioPeriodos;
using ExcellentProjectPlus.Infraestructura.Data.Calificaciones.Modelo;
using ExcellentProjectPlus.Infraestructura.Data.Calificaciones.Repositorios;
using ExcellentProjectPlus.Infraestructura.Transversales.Logging;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ExcellentProjectPlus.Infraestructura.Data.Calificaciones.UnidadDeTrabajo
{
    public class UnidadDeTrabajoCalificaciones:IUnidadDeTrabajoCalificaciones,IDisposable
    {
        DbContext context { get; set; }
        ITraceManager _traceManager;

        private RepositorioCalificaciones repositorioCalificaciones;
        private RepositorioCursoEstudiantes repositorioCursoEstudiantes;
        private RepositorioCursos repositorioCursos;
        private RepositorioPeriodos repositorioPeriodos;
        private RepositorioPromedioPeriodos repositorioPromedioPeriodos;

         #region Constructores
        public UnidadDeTrabajoCalificaciones(ITraceManager traceManager)
        {
            this._traceManager = traceManager;
            context = new CalificacionesContext();
        }
        #endregion

        public IRepositorioCalificaciones RepositorioCalificaciones
        {
            get
            {
                if (this.repositorioCalificaciones == null)
                {
                    this.repositorioCalificaciones = new RepositorioCalificaciones(context, _traceManager);
                }
                return repositorioCalificaciones;
            }
        }

        public IRepositorioCursoEstudiantes RepositorioCursoEstudiantes
        {
            get
            {
                if (this.repositorioCursoEstudiantes == null)
                {
                    this.repositorioCursoEstudiantes = new RepositorioCursoEstudiantes(context, _traceManager);
                }
                return repositorioCursoEstudiantes;
            }
        }

        public IRepositorioCursos RepositorioCursos
        {
            get
            {
                if (this.repositorioCursos == null)
                {
                    this.repositorioCursos = new RepositorioCursos(context, _traceManager);
                }
                return repositorioCursos;
            }
        }

        public IRepositorioPeriodos RepositorioPeriodos
        {
            get
            {
                if (this.repositorioPeriodos == null)
                {
                    this.repositorioPeriodos = new RepositorioPeriodos(context, _traceManager);
                }
                return repositorioPeriodos;
            }
        }

        public IRepositorioPromedioPeriodos RepositorioPromedioPeriodos
        {
            get
            {
                if (this.repositorioPromedioPeriodos == null)
                {
                    this.repositorioPromedioPeriodos = new RepositorioPromedioPeriodos(context, _traceManager);
                }
                return repositorioPromedioPeriodos;
            }
        }

        public void Confirmar()
        {
            context.SaveChanges();
        }

        private bool disposed = false;
        protected virtual void Dispose(bool disposing)
        {
            if (!this.disposed)
            {
                if (disposing)
                {
                    context.Dispose();
                }
            }
            this.disposed = true;
        }
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

    }

}
